package com.zhoux.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @author taoyi
 * @version 1.0
 * @date 2021/3/15 14:24
 *
 * 本类用于测试 使用Callable接口和Future创建线程
 * 和Runnable接口不一样，Callable接口提供了一个call()方法作为线程执行体，call()方法比run()方法功能要强大：call()方法可以有返回值，可以声明抛出异常。
 * 使用Callable和Future创建线程的步骤如下：
 * （1）定义一个类实现Callable接口，并重写call()方法，该call()方法将作为线程执行体，并且有返回值
 * （2）创建Callable实现类的实例，使用FutureTask类来包装Callable对象
 * （3）使用FutureTask对象作为Thread对象的target创建并启动线程
 * （4）调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
 */

// 1.定义一个 CallableTest 类实现Callable接口，并重写call()方法，该call()方法将作为线程执行体，并且有返回值
class CallableTest implements Callable{

    private int sum=0;

    @Override
    public Integer call() throws Exception {
        for (int i=1; i <= 10; i++) {
            sum += i;
        }
        System.out.println(Thread.currentThread().getName()+" is running:"+ sum);
        return sum;
    }
}


public class Callable_Test{
    public static void main(String[] args) {
        CallableTest callableTest = new CallableTest();  // 2.创建Callable实现类的实例
        int n = 0;
        while (n!=5){
            FutureTask<Integer> futureTask = new FutureTask<Integer>(callableTest); // 3.使用FutureTask类来包装Callable对象
            new Thread(futureTask).start(); // 4.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值使用FutureTask对象作为Thread对象的target创建并启动线程
            try{
                System.out.println("子线程的返回值:"+futureTask.get()); // 5.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
            }catch (InterruptedException e){
                e.printStackTrace();
            }catch (ExecutionException e){
                e.printStackTrace();
            }
            n++;
        }
    }
}




